<?php

namespace app\api\service\igetui;

use think\Exception;
use think\Loader;
use think\Log;

require_once EXTEND_PATH . '/GetuiSDK/igetui/template/IGt.BaseTemplate.php';
require_once EXTEND_PATH . '/GetuiSDK/igetui/template/notify/IGt.Notify.php';

class GetuiTemplate
{

    /**
     * @var string
     */
    protected $app_id;

    /**
     * @var string
     */
    protected $app_key;

    /**
     * Whether or not the phone rings when receive push message.
     *
     * @var bool
     */
    protected $is_ring;

    /**
     * Whether or not the phone vibrates when receive push message.
     *
     * @var bool
     */
    protected $is_vibrate;

    /**
     * Whether or not the push message is clearable.
     *
     * @var bool
     */
    protected $is_clearable;

    /**
     * Template type.
     *
     * @var integer
     */
    protected $type;

    /**
     * The params that template requires.
     *
     * @var mixed
     */
    protected $template_data;

//    protected $transmission_type;
//    protected $transmission_content;
//    protected $title;
//    protected $text;
//    protected $logo;
//    protected $logo_url;
//    protected $url;


    /**
     * GetuiTemplate constructor.
     *
     * @param $type
     * @param $template_data
     */
    public function __construct($type, $template_data)
    {
        $config = config('getui');
        $this->app_id = $config['app_id'];
        $this->app_key = $config['app_key'];
        $this->is_ring = $config['push']['is_ring'];
        $this->is_vibrate = $config['push']['is_vibrate'];
        $this->is_clearable = $config['push']['is_clearable'];
        $this->type = $type;
        $this->template_data = $template_data;
    }

    /**
     * //消息模版：
     *
     * 1.NotificationTemplate:点击通知打开应用模板
     * 2.LinkTemplate:点击通知打开网页模板
     * 3.NotyPopLoadTemplate：点击通知弹框下载模板
     * 4.TransmissionTemplate：透传消息模版
     *
     * 所有推送接口均支持四个消息模板，依次为通知弹框下载模板，通知链接模板，通知透传模板，透传模板
     * 注：IOS离线推送需通过APN进行转发，需填写pushInfo字段，目前仅不支持通知弹框下载功能
     */
    public function getTemplate()
    {
        switch ($this->type) {
            case 1:
                $template = $this->IGtNotificationTemplate();
                break;
            case 2:
                $template = $this->IGtLinkTemplate();
                break;
            case 3:
                $template = $this->IGtNotyPopLoadTemplate();
                break;
            case 4:
                $template = $this->IGtTransmissionTemplate();
                break;
            default:
                $template = '';
        }
        return $template;
    }

    /**
     * 点击通知打开应用模板
     */
    private function IGtNotificationTemplate()
    {
//        $data = [
//            'template_type' => 1,
//            'template_data' => [
//                'transmission_type'    => 2, // 是否立即启动应用：1 立即启动 2 等待客户端自启动，必填
//                'transmission_content' => '', // 透传内容，不支持转义字符，string(2048), 必填
//                'title' => '', // 通知标题，string(40), 必填
//                'text'  => '', // 通知内容，string(600), 必填
//                'logo'  => '', // 通知图标名称，string(40), 必填
//                'logo_url'  => '', // 通知图标url地址，string(100), 必填
//            ],
//            'cid' => 'target cid', // 推送通知至指定用户时填写
//            'cid_list' => ['cid1','cid2'], // 推送通知至指定用户列表时填写
//        ];
        // 解析模板数据
        //extract($this->template_data);
        $template_data = $this->template_data;

        $template = new \IGtNotificationTemplate();
        $template->set_appId($this->app_id); // 应用appid
        $template->set_appkey($this->app_key); // 应用appkey
        $template->set_transmissionType((int)$template_data['transmission_type']); // 透传消息类型
        $template->set_transmissionContent($template_data['transmission_content']); // 透传内容
        $template->set_title($template_data['title']); // 通知栏标题
        $template->set_text($template_data['text']); // 通知栏内容
        $template->set_logo($template_data['logo']); // 通知栏logo
        $template->set_logoURL($template_data['logo_url']); // 通知栏logo链接
        $template->set_isRing(isset($is_ring) ? (boolean)$is_ring : $this->is_ring); // 是否响铃
        $template->set_isVibrate(isset($is_vibrate) ? (boolean)$is_vibrate : $this->is_vibrate); // 是否震动
        $template->set_isClearable(isset($is_clearable) ? (boolean)$is_clearable : $this->is_clearable); // 通知栏是否可清除
        if (isset($template_data['begin_at']) && isset($template_data['end_at'])) {
            $template->set_duration(
                date_format(date_create($template_data['begin_at']), 'Y-m-d H:i:s'),
                date_format(date_create($template_data['end_at']), 'Y-m-d H:i:s')
            );
        }

        return $template;
    }

    /**
     * 点击通知打开网页模板
     */
    private function IGtLinkTemplate()
    {
//        $data = [
//            'template_type' => 2,
//            'template_data' => [
//                'title' => '', // 通知标题，string(40), 必填
//                'text'  => '', // 通知内容，string(600), 必填
//                'url'   => '', // 点击通知后打开的网页地址，string(200), 必填
//                'logo'  => '', // 通知图标名称，string(40), 必填
//                'logo_url'  => '', // 通知图标url地址，string(100), 必填
//            ],
//            'cid' => 'target cid', // 推送通知至指定用户时填写
//            'cid_list' => ['cid1','cid2'], // 推送通知至指定用户列表时填写
//        ];
        // 解析模板数据
        //extract($this->template_data);
        $template_data = $this->template_data;

        $template = new \IGtLinkTemplate();
        $template->set_appId($this->app_id);
        $template->set_appkey($this->app_key);
        $template->set_title($template_data['title']);
        $template->set_text($template_data['text']);
        $template->set_logo($template_data['logo']);
        $template->set_logoURL($template_data['logo_url']);
        $template->set_isRing(isset($is_ring) ? (boolean)$is_ring : $this->is_ring);
        $template->set_isVibrate(isset($is_vibrate) ? (boolean)$is_vibrate : $this->is_vibrate);
        $template->set_isClearable(isset($is_clearable) ? (boolean)$is_clearable : $this->is_clearable);
        $template->set_url($template_data['url']); // 打开连接地址
        if (isset($template_data['begin_at']) && isset($template_data['end_at'])) {
            $template->set_duration(
                date_format(date_create($template_data['begin_at']), 'Y-m-d H:i:s'),
                date_format(date_create($template_data['end_at']), 'Y-m-d H:i:s')
            );
        }

        return $template;
    }

    /**
     * 点击通知弹窗下载模板
     */
    private function IGtNotyPopLoadTemplate()
    {
//        $data = [
//            'template_type' => 3,
//            'template_data' => [
//                'title' => '', // 通知标题，string(40), 必填
//                'text'  => '', // 通知内容，string(600), 必填
//                'pop_title'   => '', // 弹出框标题，string(40), 必填
//                'pop_content' => '', // 弹出框内容，string(600), 必填
//                'pop_image'   => '', // 弹出框图标，string(200), 必填
//                'load_icon'   => '', // 下载图标: 本地图标[file://]， 网络图标[http:// 或 https://]，string(40), 必填
//                'load_title'  => '', // 下载标题，string(40), 必填
//                'load_url'    => '', // 下载地址，string(200), 必填
//                'is_auto_install' => true, // 是否自动安装（默认否），boolean
//                'is_actived'  => false, // 安装完成后是否自动启动应用程序（默认否），boolean
//            ],
//            'cid' => 'target cid', // 推送通知至指定用户时填写
//            'cid_list' => ['cid1','cid2'], // 推送通知至指定用户列表时填写
//        ];
        // 解析模板数据
        //extract($this->template_data);
        $template_data = $this->template_data;

        $template = new \IGtNotyPopLoadTemplate();
        $template->set_appId($this->app_id);
        $template->set_appkey($this->app_key);
        // 通知栏
        $template->set_notyTitle($template_data['title']);
        $template->set_notyContent($template_data['text']);
        $template->set_notyIcon($template_data['logo']);
        // 弹框
        $template->set_popTitle($template_data['pop_title']); // 弹框标题
        $template->set_popContent($template_data['pop_content']); // 弹框内容
        $template->set_popImage($template_data['pop_image']); // 弹框图片
        $template->set_popButton1('下载'); // 左键
        $template->set_popButton2(''); // 右键
        // 下载
        $template->set_loadIcon($template_data['load_icon']);
        $template->set_loadTitle($template_data['load_title']);
        $template->set_loadUrl($template_data['load_url']);

        $template->set_isAutoInstall(isset($is_auto_install) ? (boolean)$is_auto_install : false);
        $template->set_isActived(isset($is_actived) ? (boolean)$is_actived : false);
        $template->set_isRing(isset($is_ring) ? (boolean)$is_ring : $this->is_ring);
        $template->set_isVibrate(isset($is_vibrate) ? (boolean)$is_vibrate : $this->is_vibrate);
        $template->set_isClearable(isset($is_clearable) ? (boolean)$is_clearable : $this->is_clearable);
        if (isset($template_data['begin_at']) && isset($template_data['end_at'])) {
            $template->set_duration(
                date_format(date_create($template_data['begin_at']), 'Y-m-d H:i:s'),
                date_format(date_create($template_data['end_at']), 'Y-m-d H:i:s')
            );
        }

        return $template;
    }

    /**
     * 透传消息模版
     */
    private function IGtTransmissionTemplate()
    {
        //当 is_content_available = false 时，title 与 text 必填
//        $data = [
//            'template_type' => 4,
//            'template_data' => [
//                'transmission_type' => 2, // 是否立即启动应用：1 立即启动 2 等待客户端自启动，必填
//                'transmission_content' => '', // 透传内容，不支持转义字符，string(2048), 必填
//                'is_ios' => false, // 是否支持 ios （默认不支持），boolean
//                'is_content_available' => false, // 推送是否直接带有透传数据（默认否）, boolean
//                'badge' => '', // 应用icon上显示的数字，int
//                'sound' => '', // 通知铃声文件名，string
//                'category' => '', // 在客户端通知栏触发特定的action和button显示，string
//                'custom_msg' => [
//                    'key1' => 'value1',
//                    'key2' => 'value2',
//                ], // 增加自定义的数据
//                'title' => '', // 通知标题，string
//                'text' => true, // 通知内容，string
//            ],
//            'cid' => 'target cid', // 推送通知至指定用户时填写
//            'cid_list' => ['cid1','cid2'], // 推送通知至指定用户列表时填写
//        ];
        // 解析模板数据
        //extract($this->template_data);
        $template_data = $this->template_data;

        $template = new \IGtTransmissionTemplate();
        $template->set_appId($this->app_id); // 应用appid
        $template->set_appkey($this->app_key); // 应用appkey
        $template->set_transmissionType((int)$template_data['transmission_type']); // 透传消息类型
        $template->set_transmissionContent($template_data['transmission_content']); // 透传内容

        if (isset($template_data['is_ios']) && (bool)$template_data['is_ios']) {
            // APN简单推送
            $apn = new \IGtAPNPayload();
            $alertmsg = new \SimpleAlertMsg();
            $alertmsg->alertMsg = "abcdefg3";
            $apn->alertMsg = $alertmsg;
            $apn->badge = 2;
            $apn->sound = "";
            $apn->add_customMsg("payload", "payload");
            $apn->contentAvailable = 1;
            $apn->category = "ACTIONABLE";
            $template->set_apnInfo($apn);

            // VOIP推送
            /*$voip = new \VOIPPayload();
            $voip->setVoIPPayload("新浪");
            $template->set_apnInfo($voip);*/

            // 第三方厂商推送透传消息带通知处理
            /*$notify = new \IGtNotify();
            $notify->set_payload("透传测试内容");
            $notify->set_title("透传通知标题");
            $notify->set_content("透传通知内容");
            $notify->set_url("https://www.baidu.com");
            $notify->set_type(NotifyInfo_Type::_url);
            $template->set3rdNotifyInfo($notify);*/

            // APN高级推送
            $apn = new \IGtAPNPayload();
            if (isset($template_data['is_content_available']) && (bool)$template_data['is_content_available']) {
                $apn->contentAvailable = 1;
            } else {
                $apn->contentAvailable = 0;
                $alertmsg = new \DictionaryAlertMsg();
                $alertmsg->body = $template_data['text'];
//                $alertmsg->actionLocKey = "ActionLockey";
//                $alertmsg->locKey = "LocKey";
//                $alertmsg->locArgs = array("locargs");
//                $alertmsg->launchImage = "launchimage";
                // IOS8.2 支持
                $alertmsg->title = $template_data['title'];
//                $alertmsg->titleLocKey = "TitleLocKey";
//                $alertmsg->titleLocArgs = array("TitleLocArg");

                $apn->alertMsg = $template_data['alertmsg'];
            }
            if (isset($template_data['badge'])) {
                $apn->badge = (int)$template_data['badge'];
            }
            if (isset($template_data['sound'])) {
                $apn->sound = $template_data['sound'];
            }
            if (isset($template_data['category'])) {
                $apn->category = $template_data['category'];
            }
            if (isset($template_data['custom_msg']) && count($template_data['custom_msg']) > 0) {
                foreach ($template_data['custom_msg'] as $key => $value) {
                    $apn->add_customMsg($key, $value);
                }
            }
            $template->set_apnInfo($apn);

            // IOS多媒体消息处理
            /*$media = new \IGtMultiMedia();
            $media->set_url("http://docs.getui.com/start/img/pushapp_android.png");
            $media->set_onlywifi(false);
            $media->set_type(MediaType::pic);
            $medias = array();
            $medias[] = $media;
            $apn->set_multiMedias($medias);
            $template->set_apnInfo($apn);*/
        }

        return $template;
    }
}